home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / hce.lha / HCE / LibSource / AmigaLib / EXTRAS / Source / CreateTask.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-02  |  1.3 KB  |  60 lines

  1. #include <exec/types.h>
  2. #include <exec/tasks.h>
  3. #include <exec/memory.h>
  4.  
  5. #define ME_TASK    0
  6. #define ME_STACK   1
  7. #define NUMENTRIES 2
  8.  
  9. struct FakeMemEntry {
  10.      ULONG fme_Reqs;
  11.      ULONG fme_Length;
  12. };
  13.  
  14. struct FakeMemList {
  15.     struct Node fml_Node;
  16.     UWORD fml_NumEntries;
  17.     struct FakeMemEntry fml_ME[NUMENTRIES];
  18. };
  19.  
  20. struct FakeMemList TaskMemTemplate = {
  21.       { 0 },
  22.       NUMENTRIES,
  23.       {
  24.         { MEMF_PUBLIC | MEMF_CLEAR, sizeof(struct Task) },
  25.         { MEMF_CLEAR, 0 }
  26.        }  
  27. };
  28.  
  29. struct Task *CreateTask (name, pri, initPC, stacksize)
  30. char *name;
  31. ULONG pri;
  32. APTR initPC;
  33. ULONG stacksize;
  34. {
  35.     struct Task *newTask;
  36.     struct FakeMemList fakememlist;
  37.     struct MemList *ml;
  38.  
  39.     stacksize = (stacksize + 3) & ~3;
  40.  
  41.     fakememlist = TaskMemTemplate;
  42.     fakememlist.fml_ME[ME_STACK].fme_Length = stacksize;
  43.     ml = (struct MemList *)AllocEntry((struct MemList *)&fakememlist);
  44.  
  45.     if(!ml)
  46.         return(NULL);
  47.         newTask = (struct Task *)ml->ml_ME[ME_TASK].me_Addr;
  48.         newTask->tc_SPLower = ml->ml_ME[ME_TASK].me_Addr;
  49.  
  50.         newTask->tc_SPUpper = (APTR)((ULONG)(newTask->tc_SPLower) + stacksize);
  51.  
  52.         newTask->tc_Node.ln_Type = NT_TASK;
  53.         newTask->tc_Node.ln_Pri = pri;
  54.         newTask->tc_Node.ln_Name = name;
  55.  
  56.         AddTask (newTask, initPC, 0L);
  57.  
  58.     return (newTask);
  59. }
  60.